/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package presentacion.utilidad;

import logica.CapaLogica;
import org.hibernate.Query;

/**
 *
 * @author Gonzalo
 */
public class Paginador {
    // Primer elemento a mostrar. Es un arreglo, ya que pueden existir n
    //paginadores activos en una ventana
    public static int[] primerElemento = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];
    // Rango de filas a mostrar. Es un arreglo, ya que pueden existir n 
    //paginadores activos en una ventana
    public static int[] rangoFilas = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];
    // Indica si se debe paginar. Es un arreglo, ya que pueden existir n
    //paginadores activos en una ventana
    public static boolean[] paginarElemento = new boolean[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];
    //Indica que paginador se encuentra acitvo en la gui donde se visualiza
    public static int paginadorActivo;

    /**
     * Inicializa el paginador.
     *
     * @param unRangoFilas Los rangos de filas a mostrar
     */
    public static void inicializarPaginador(int unRangoFilas[]) {

        for (int i = 0; i < rangoFilas.length; i++) {
             primerElemento[i] = 0;
             rangoFilas[i] = unRangoFilas[i];
             paginarElemento[i] = false;
        }
    }

    /**
     * Setea el primer elemento de un paginador.
     *
     * @param unPaginadorActivo Paginador activo
     * @param valor Valor del primer elemento
     */
    public static void setPrimerElemento (int unPaginadorActivo, int valor) {
        primerElemento[unPaginadorActivo] = valor;
    }

    /**
     * Setea si el elemento se debe paginar.
     *
     * @param unPaginadorActivo Paginador activo
     * @param unPaginarElemento  Valor que indica si se debe paginar
     */
    public static void setPaginarElemento (int unPaginadorActivo, boolean unPaginarElemento) {
        paginarElemento[unPaginadorActivo] = unPaginarElemento;
    }
    /**
     * Setea el rango de filas de un paginador activo.
     *
     * @param unPaginadorActivo Paginador activo
     * @param valor Valor del primer elemento
     */
    public static void setRangoFilas (int unPaginadorActivo, int valor) {
        rangoFilas[unPaginadorActivo] = valor;
    }

    /**
     * Setea que paginador se encuentra activo.
     *
     * @param UnPaginadorActivo El paginador activo. Si es -1, ninguno esta activo.
     */
    public static void setPaginadorActivo (int UnPaginadorActivo) {
        paginadorActivo = UnPaginadorActivo;
    }

    /**
     * Produce un retroceso del primer elemento, si es posible, debido a un
     * avance hacia atrás de la visualización.
     *
     * @param unPaginadorActivo Paginador activo
     */
    public static void atrasPaginador(int unPaginadorActivo) {
            paginadorActivo = unPaginadorActivo;
            if (primerElemento[unPaginadorActivo] - rangoFilas[unPaginadorActivo] >= 0) {
                primerElemento[unPaginadorActivo] = primerElemento[unPaginadorActivo] - rangoFilas[unPaginadorActivo];
            }
    }

    /**
     * Produce un avance del primer elemento, si es posible, debido a un
     * avance hacia adelante de la visualización.
     *
     * @param unPaginadorActivo Paginador activo
     */
    public static void adelantePaginador(int unPaginadorActivo) {
            paginadorActivo = unPaginadorActivo;
            primerElemento[unPaginadorActivo] =
            primerElemento[unPaginadorActivo] + rangoFilas[unPaginadorActivo];
    }

    /**
     * Actualiza el indice de un paginador activo. Vuelve a cero el indice
     * si corresponde o lo deja en el valor que se encuentra.
     *
     * @param unPaginadorActivo Paginador activo
     */
    public static void actualizaIndice(int unPaginadorActivo) {
        if (!Paginador.paginarElemento[unPaginadorActivo]) {
            // Si no se esta paginando se debe reiniciar el primer elemento y
            //setear que paginador esta activo
            setPrimerElemento(unPaginadorActivo, 0);
            setPaginadorActivo(unPaginadorActivo);
        }
    }

    /**
     * Realiza la paginación. Recibe una consulta Hibernate y le setea el
     * rango a visualizar, según el paginador activo.
     *
     * @param q La consulta a setear
     */
    public static void paginar(Query q) {
        //Si está activado el paginador, pagina según el rango solicitado
        if (primerElemento[paginadorActivo] != -1 &&
                rangoFilas[paginadorActivo] != -1) {
            q.setFirstResult(primerElemento[paginadorActivo]);
            q.setMaxResults(rangoFilas[paginadorActivo]);
        }
    }

}
